package com.lxyk.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lxyk.pojo.Customer;
import com.lxyk.pojo.MainMenu;
import com.lxyk.pojo.Worker;
import com.lxyk.service.WorkerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;


import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @ClassName WorkerController
 * @Description TODO
 * @Author FJQ
 * @Date 2022/10/24 15:09
 * @Version 1.0
 **/
@Controller
@RequestMapping("/worker")
@Slf4j
public class WorkerController {

    @Autowired
    private WorkerService workerService;
    @Autowired
    private RedisTemplate redisTemplate;

    @Value("${location}")
    private String location;


    @RequestMapping("/workerList")
    public String listWorker(@RequestParam(required = false,defaultValue = "1",value = "pageNum")Integer pageNum,
                           @RequestParam(defaultValue = "10",value = "pageSize")Integer pageSize , Model model,Worker worker){

        if (pageNum <= 0 || pageNum.equals("") || pageNum == null){
            pageNum = 1;
        }
        if (pageSize <= 0 || pageSize.equals("") || pageSize == null){
            pageSize = 10;
        }

        PageHelper.startPage(pageNum,pageSize);
        PageInfo<Worker> pageInfo = workerService.listWorker(worker,pageNum, pageSize);
        model.addAttribute("pageInfo",pageInfo);
        return "workerList";
    }



    @RequestMapping("/preSaveWorker")
    public String preSaveWorker(){
        return "workerSave";
    }

    /**
     * 在“添加送水工”页面点击“提交”按钮，添加送水工信息
     * 步骤：
     * 1 上传送水工照片
     * 1.1 获取上传文件的名称
     * 1.2 获取上传文件后缀的索引
     * 1.3 根据索引获取上传的文件名后缀，例如：.png
     * 1.4 获取上传文件的前缀，例如：15456435635。注意前缀命名使用1970-01-01距离现在的毫秒数
     * 1.5 判断上传路径是否存在，如果不存在创建改路径。例如： D:/upLoad/picture/
     * 1.6 拼接上传文件的前缀和后缀名称。例如：15456435635.png。然后创建对应的File对象
     * 1.7 上传文件
     * 1.8 将凭借的上传文件名称设置到Worker对象中
     * 2 调用WorkerService对象的saveWorker方法，将送水工信息保存到数据库中
     * 3 重定向到客户列表，显示新添加的送水工信息
     * @param worker 表单采集的新送水工信息
     * @param file 封装了浏览器上传的图片数据
     * @return 重定向到客户列表，显示新添加的送水工信息
     */
    @RequestMapping(value="/workerSave",method = RequestMethod.POST)
    public String saveWorker(Worker worker, MultipartFile file) {
        transferFile(worker, file);
        workerService.saveWorker(worker);

        // 拿到redis的长度
        Long size = redisTemplate.opsForList().size("mainMenu");
        if (size < 12) {
            MainMenu menu = new MainMenu();
            menu.setWorkerName(worker.getWorkerName());
            menu.setSendWaterCount(0);
            redisTemplate.opsForList().rightPush("mainMenu",menu);
        }

        return "redirect:/worker/workerList";
    }

    /**
     * 处理浏览器上传文件的逻辑
     * @param worker
     * @param file
     */
    private void transferFile(Worker worker, MultipartFile file) {
        // 条件成立：表示用户在浏览器上传了图像
        if (null != file) {
            // 获取上传文件的名称
            String fileName = file.getOriginalFilename();
            // 获取上传文件后缀的索引
            int index = fileName.lastIndexOf(".");
            // 获取上传文件的后缀，例如：.png
            String suffix = fileName.substring(index);
            // 返回1970-01-01距离现在的纳秒数作为上传文件的前缀
            // 例如： 1565634653563456
            long prefix = System.nanoTime();
            // 拼接上传文件的前缀和后缀，例如：1565634653563456.png
            String uploadFileName = prefix + suffix;
            // 创建服务器存放浏览器上传文件的File对象
            File uploadFile = new File(location);
            // 条件成立：表示路径不存在，在服务器磁盘上创建改路径
            if (!uploadFile.exists()) {
                uploadFile.mkdirs();
            }
            // 创建上传文件的File对象
            // 参数1：上传文件的路径，参数2：上传文件的名称
            File path = new File(uploadFile, uploadFileName);
            try {
                file.transferTo(path);
            } catch (IOException e) {
                e.printStackTrace();
            }
            worker.setWorkerImage(uploadFileName);
        }
    }


    /**
     * 点击“修改”按钮，数据回显。根据id查询对应的送水工信息，并将信息渲染到“修改送水工”页面
     * @param wid 送水工id
     * @param model
     * @return “修改送水工”页面
     */
    @RequestMapping("/preUpdateWorker/{wid}")
    public String preUpdateWorker(@PathVariable("wid") Integer wid,Model model) {
        Worker worker = workerService.getWorkerById(wid);
        model.addAttribute("worker",worker);
        return "workerUpdate";
    }

    /**
     * 在“修改送水工”页面点击“提交”按钮，修改送水工信息，将修改的信息持久化到数据库
     * @param worker 送水工信息
     * @param file 封装了要上传文件的信息
     * @return 送水工列表请求路径，重新查询已修改的送水工信息
     */
    @RequestMapping(value="/updateWorker",method = RequestMethod.POST)
    public String updateWorker(Worker worker, MultipartFile file) {
        // 条件成立：表示用户在浏览器上传了图像
        transferFile(worker, file);
        workerService.updateWorker(worker);
        return "redirect:/worker/workerList";
    }

    /**
     * 工资调整
     * @param wid
     * @param workerSalary
     * @return
     */
    @PostMapping("/addSalary")
    @ResponseBody   //返回JSON字符串
    public String addSalary(Integer wid,Integer workerSalary){
        int rows = workerService.addSalary(wid, workerSalary);
        if (rows > 0 ){
            return "OK";
        }else {
            return "error";
        }
    }

}
